﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Entity;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using SIBI.Models;

namespace SIBI.Controllers
{ 
    public class CargoBajasController : Controller
    {
        //Crear contexto de conexión con la BD SIBI
        private SIBIContext db = new SIBIContext();

        //Crear contexto de conexión con la BD TEJECUTIVO
        private TEJECUTIVOContext db1 = new TEJECUTIVOContext();

        //***********************************************************************************//
        // Autor:  	Adrian Di Puglia				                	     				*//
        //***********************************************************************************//
        // Index()		Acceso solo ADMINISTRADOR                 							*//
        // Función que devuelve la vista de todos los ítems de BI  por Re-Asignarlistados   *//
        // en la pantalla.	                                                                *// 
        // _________________________________________________________________________________*//
        // Entrada: None                                        							*//
        // _________________________________________________________________________________*//
        // Salida:  Vista que posee todos los bienes informáticos listados 					*//
        // _________________________________________________________________________________*//
        //***********************************************************************************//
        //****                        INICIO  PROYECTO SIBI V.1.0                         ***//
        //****                             Adrian Di Puglia                               ***//
        //***********************************************************************************//
        [Authorize(Roles = "Admin")]
        public ViewResult Index()
        {

            var cargoBi = (from b in db.BienInformaticoes
                select b.CargoId).ToList();

            var cargosTrans = (from cs in db.CargoBajas
                               where cs.cbac == true && cs.aflg == false && cargoBi.Contains(cs.idCargoNew)
                               orderby cs.dbaj
                               select cs).ToList();

            return View(cargosTrans);
        }


        //***********************************************************************************//
        // Autor:  	Adrian Di Puglia					                     				*//
        //***********************************************************************************//
        // ReAsignacion()	Acceso solo ADMINISTRADOR					    		        *//
        // Acción que devuelve la vista para Re-Asignar un un BI a un usuario.              *//
        // Método GET.                     |                               		    		*//
        // _________________________________________________________________________________*//
        // Entrada: 																		*//
        // _________________________________________________________________________________*//
        // Salida:  Vista que devuelve los BI a re-asignar.							        *//
        // _________________________________________________________________________________*//
        [Authorize(Roles = "Admin")]
        public ActionResult ReAsignacion(string idCargo)
        {

            var bi = db.BienInformaticoes.Include(b => b.nest).Include(b => b.ntib).Include(b => b.nsoc).Include(b => b.ndiv).Include(b => b.ncar).Include(b => b.nmym);
            
            bi = bi.Where(b => b.CargoId.Contains(idCargo));
            
            bi = bi.OrderBy(x => x.BienInformaticoId);

            ViewBag.Cargo = bi.FirstOrDefault().ncar.cdes;
            ViewBag.Empleado = bi.FirstOrDefault().ncar.empleados;

            return View(bi);
        }



        //***********************************************************************************//
        // Autor:  	Adrian Di Puglia					                     				*//
        //***********************************************************************************//
        // ReAsignacion()	Acceso solo ADMINISTRADOR					    		        *//
        // Acción que devuelve la vista para Re-Asignar un un BI a un usuario.              *//
        // Método POST.                                                    		    		*//
        // _________________________________________________________________________________*//
        // Entrada: Bien Informatico Reasignado												*//
        // _________________________________________________________________________________*//
        // Salida:  Vista que devuelve los BI a re-asignar.							        *//
        // _________________________________________________________________________________*//
        [Authorize(Roles = "Admin")]
        [HttpPost]
        public ActionResult ReAsignacion(string idCargoBaja, int? page = 1)
        {

            var query = (from car in db.CargoBajas
                        where car.idCargoNew == idCargoBaja && car.aflg==false
                        select car).FirstOrDefault();

            query.aflg = true;



            var bienInformatico = db.BienInformaticoes.Include(b => b.nest).Include(b => b.ntib).Include(b => b.nsoc).Include(b => b.ndiv).Include(b => b.ncar).Include(b => b.nmym);

            bienInformatico = bienInformatico.Where(b => b.CargoId.Contains(idCargoBaja));

            foreach (var bi in bienInformatico)
            {

                var cargoN = (from m in db.Cargoes
                              where m.CargoId == bi.CargoId
                              select m).ToList().FirstOrDefault();

                var obs = "Cargo involucrado en movimiento. " + cargoN.cdes.Replace('.', ' ') + ", " + cargoN.empleados.Replace('.', ' ') + ".";


                creacionMovimiento("Entrada", obs+ " Movimiento generado por Re-Asignación del BI", bi.cubf,
                                    bi.localidad_id, 1,
                                    bi.BienInformaticoId);
            }

            db.SaveChanges();
            return RedirectToAction("Index");
        }


        //***********************************************************************************//
        // Autor:  	Adrian Di Puglia        			                     				*//
        //***********************************************************************************//
        // PreviewReAsignacion()	Acceso solo ADMINISTRADOR   							*//
        // Acción que devuelve la vista del preview de la Re-Asignación                     *//
        // _________________________________________________________________________________*//
        // Entrada: 																		*//
        // •	id: identificador del BI que se desea ver el preview 						*//
        // _________________________________________________________________________________*//
        // Salida:  Vista que devuelve el preview de la Re-Asignación realizada.		    *//
        // _________________________________________________________________________________*//
        [Authorize(Roles = "Admin")]
        public ActionResult PreviewReAsignacion(string id)
        {
            BienInformatico bieninformatico = db.BienInformaticoes.Find(id);

            //Busqueda del nombre de la localidad
            var localidad = from m in db1.LOCALIDAD
                            where m.localidad_id == bieninformatico.localidad_id
                            select m.localidad_nombre;

            ViewBag.localidad_id = localidad;

            return View(bieninformatico);
        }


        //***********************************************************************************//
        // Autor:  									                	     				*//
        //***********************************************************************************//
        // creacionMovimiento()		                        							    *//
        // Función que se encarga de realizar los movimientos       						*//
        // _________________________________________________________________________________*//
        // Entrada: 																		*//
        // •	tipoMov: Tipo de movimiento que se esta realizando. Entrada/Salida          *//
        // •	observacion: Observacion que se desea colocar                               *// 
        // •	ubicacionF: Ubicacion fisica en el que queda el BI                          *//
        // •	localidad: Localidad en la que va a estar el BI                             *//	
        // •	causaMov: Causa movimiento, Revision, Asignacion, Resguardo, Mantenimiento  *//
        // •	serial: Serial del BI que realizó el movimiento                             *//
        // _________________________________________________________________________________*//
        // Salida:  Realiza el movimiento dependiendo de los parametros colocados			*//
        // _________________________________________________________________________________*//
        private void creacionMovimiento(string tipoMov, string observacion,
                            string ubicacionF, string localidad,
                            int causaMov, string serial)
        {

            Movimiento movimiento = new Movimiento
            {
                dmov = DateTime.Now.Date,
                dfmo = DateTime.Now.Date,
                ctmo = tipoMov,
                cobs = observacion,
                cubf = ubicacionF,
                localidad_id = localidad,
                CausaMovimientoId = causaMov,
                BienInformaticoId = serial
            };
            db.Movimientoes.Add(movimiento);
        }


        protected override void Dispose(bool disposing)
        {
            db.Dispose();
            base.Dispose(disposing);
        }
        //***********************************************************************************//
        //****                          FIN  PROYECTO SIBI V.1.0                          ***//
        //***********************************************************************************//
    }
}